#ifndef VALOR_H
#define VALOR_H

#include <QVariant>
#include "expresiones_global.h"

#define VALOR_NULO     0
#define VALOR_BOOLEANO 1
#define VALOR_ENTERO   2
#define VALOR_REAL     3 
#define VALOR_CADENA   4

#define TIPO_VALOR Valor
#define VALOR_A_REAL(x) ( (x).getVariant().toDouble() )

class EXPRESIONES_EXPORT Valor
{
public:
    Valor();
    Valor(bool booleano);
    Valor(double real);
    Valor(int entero);
    Valor(long long entero);
    Valor(const QString& cadena);
    Valor(const QVariant& variant);

    Valor operator+(const Valor& otroValor) const;
    Valor Valor::operator-(const Valor& otroValor) const;
    Valor Valor::operator*(const Valor& otroValor) const;
    Valor Valor::operator/(const Valor& otroValor) const;

    Valor Valor::operator-() const;

    Valor Valor::operator<(const Valor& otroValor) const;
    Valor Valor::operator<=(const Valor& otroValor) const;
    Valor Valor::operator>(const Valor& otroValor) const;
    Valor Valor::operator>=(const Valor& otroValor) const;
    Valor Valor::operator!=(const Valor& otroValor) const;
    Valor Valor::operator==(const Valor& otroValor) const;
    Valor Valor::operator&&(const Valor& otroValor) const;
    Valor Valor::operator||(const Valor& otroValor) const;

    QVariant getVariant() const { return variant; }

    QString toString() { return variant.toString(); }
    bool toBool() { return variant.toBool(); }

    void setTipo(int tipo);
    int getTipo();

    ~Valor();

private:
    int tipo;
    QVariant variant;
};

Valor sqrt(const Valor& valor);
Valor pow(const Valor& valor1, const Valor& valor2);

#endif // VALOR_H
